package com.azt.api.service;

import com.azt.api.dto.*;
import com.azt.api.pojo.*;
import com.azt.model.AjaxJson;
import com.azt.model.page.Pagination;
import com.azt.model.page.TPagination;
import org.apache.ibatis.annotations.Param;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;


/**
 * The interface Enq enquiry service.
 *
 * @author 张栋 2016年8月10日上午10:51:30
 */
public interface EnqEnquiryService {

	/**
	 * 首页最新询价单：公开发布、对自己私发、项目需求状态不为退回修改（未对询价单本身的状态做限制）
	 * */
    List<IndexEnquiry> findIndexEnquiry(Integer companyId, int pageSize);

	/**
	 * 首页询价单数量
	 * */
	int getIndexEnquiryCount();

	EnqEnquiry getEnquiryById(int enquiryId);

    /**
	 * 分页查
	 *
	 * @param pageno    the pageno
	 * @param pagesize  the pagesize
	 * @param searchMap the search map
	 * @return enq enquiry page
	 * @author 张栋 2016年5月5日下午2:25:54
	 */
	Pagination getEnqEnquiryPage(int pageno, int pagesize, Map<String, String> searchMap);


	/**
	 * 分页查需要分析的报价
	 * @param pageno
	 * @param pagesize
	 * @param searchMap
	 * @return
	 */
	Pagination getQuoteAnalysisPage(int pageno, int pagesize, Map<String, String> searchMap);


	/**
	 * 根据询价ID获取需要分析的报价数量
	 * @param enquiryId
	 * @return
	 */
	Integer ifAnalysisQuote(Integer enquiryId);

	/**
	 * Gets enquiry by id.
	 * join project
	 *
	 * @param id the id
	 * @return enquiry by id
	 * @author 张栋 2016年8月10日上午10:26:16
	 */
	EnqEnquiry getEnquiryById(Integer id);

	/**
	 * Save or update enq.
	 *
	 * @param enquiry the enquiry
	 * @author 张栋 2016年8月10日上午10:28:05
	 */
	void saveOrUpdateEnq(EnqEnquiry enquiry);


	/**
	 * 保存或者更新item
	 * 如果数据库有，则先删除后添加
	 *
	 * @param enquiryid the enquiryid
	 * @param item      the item
	 * @author 张栋 2016年5月12日下午1:39:08
	 */
	void saveOrUpdateEnquiryItem(Integer enquiryid, List<EnqEnquiryItem> item);

	/**
	 * 获取该enquiry下的所有子item
	 *
	 * @param enquiryid the enquiryid
	 * @return enquiry item
	 * @author 张栋 2016年8月11日上午11:42:06
	 */
	List<EnqEnquiryItem> getEnquiryItem(Integer enquiryid);

	/**
	 * excel转html预览
	 *
	 * @param string the string
	 * @return string
	 * @author 张栋 2016年9月12日上午11:10:04
	 */
	String excelToHtml(String string);


	/**
	 * Change enquiry state enq enquiry.
	 *
	 * @param id       the id
	 * @param prostate the prostate
	 * @return the enq enquiry
	 */
	EnqEnquiry changeEnquiryState(Integer id, Integer prostate);





    /*-------------------------------for front  ----------------------------------*/


    /**
     * 判断是不是管理员或者财务
	 * 询价这边这个判断多,单独拿出来
     * Created by 张栋 on 2017/4/1 13:17
     */
	public boolean isAdminOrFinance(Integer userid);

    /*------我的项目------*/
	/**
	 * 我的项目列表查询
	 * Created by 张栋 on 2016/9/14 11:20
	 */
	TPagination<EnqProjListDto>  getMyProject(Integer pageNo, int pageSize, EnqProjSearchDto dto);



    /*------我的项目详情-----*/
	/**
	 *
	 * 获取项目详情,根据项目id
	 * Created by 张栋 on 2016/9/14 11:34
	 */
	EnqProject getEnqProjectById(Integer projid);



	/**
	 * 我的项目,详情,采购/设计 列表
     * //'1.设计需求 2.采购询价',
	 * Created by 张栋 on 2016/9/14 14:21
	 */
	TPagination<EnqProjDetailDto> getEnqProjDetail(Integer projid, Integer qtype, Integer userid, Integer companyId, Integer pageNo, Integer pageSize);

	/**
	 * 我的项目,详情, 预算清单
	 */
    TPagination<EnqBudget>  getBudGetDetail(Integer projid, Integer budgettype,  Integer userid, Integer companyId, Integer pageNo , Integer pageSize);

	/*
	*	供应商推送询价列表查询
	*	PushEnqirySearchDto 存放所有查询条件
	* */
	TPagination<PushEnquiryListDto> getPushEnquiryList(PushEnqirySearchDto psd , Integer pageNo , Integer pageSize);

	/**
	 * 根据公司获取平台推送的询价数量
	 * @param companyId
	 * @return
	 */
	Integer getPushEnquiryCount(Integer companyId);

	/**
	 * 我参与的询价数量查询
	 * @param userId
	 * @param companyId
	 * @param qtype
	 * @return
	 */
	Integer getMyQuoteCount(@Param("userId") Integer userId , @Param("companyId") Integer companyId , @Param("qtype") Integer qtype);


	/**
	 * 供应商参与询价列表
	 * @param psd
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	TPagination<QuoteListDto> getMyQuoteList(PushEnqirySearchDto psd , Integer pageNo , Integer pageSize);

	/**
	 * 首页我参与的询价
	 * @param userId
	 * @param companyId
	 * @return
	 */
	List<QuoteListDto> getCenterQuoteList(@Param("userId") Integer userId , @Param("companyId") Integer companyId);




	/*-------------预算详情------------*/
	/**
	 *获取预算详情表
	 * Created by 张栋 on 2016/9/20 10:41
	 */
	EnqBudgetDetailWrap getBudGetDetailWrap(Integer budgetid);

	/**
	 * 创建预算清单 主列表
     * @param  enqid 询价id
     * Created by 张栋 on 2016/9/20 17:19
     */
    List<EnqBgetCreate> getEnqBgetCreate(List<Integer> enqid);

	/**
	 * 创建预算清单  子列表
	 * @param quoteid 报价主表id
	 * Created by 张栋 on 2016/9/21 10:22
	 */
	List<EnqQuoteItemExt> getBudGetDetail(Integer quoteid);

	/**
	 * 生成设计预算清单
     * @return 主表id
	 * Created by 张栋 on 2016/9/21 10:57
	 */
	Integer budgetDesignSave(Integer quoteid, Integer userid, Integer companyId);

	/**
	 *根据询价id和供应商companyId进入到报价页面
	 * @param id
	 * @param companyId
	 * @return
	 */
	QuoteEnquiryDto getQuoteInfo(Integer id , Integer companyId);


	/**
	 * 基本的获取询价信息的方法  没什么限制条件
	 * @param id
	 * @return
	 */
	QuoteEnquiryDto getBaseEnquiryInfo(Integer id);


	/**
	 *
	 * 获取所有Porject信息
	 * 1.用于,创建询价清单,获取我的项目历史表
	 * Created by 张栋 on 2016/9/27 10:19
	 */
    List<EnqProject> getProjeListBYUserid(Integer id);

	/**
	 *
	 * 创建询价,外部
	 * Created by 张栋 on 2016/9/27 10:19
	 */
	EnqEnquiry savePurchaseExternal(EnqEnquiry enqa);

	/**
	 * 制作采购预算清单
	 * 根据选择的报价商的id
	 * Created by 张栋 on 2016/9/27 14:13
	 */
    List<EnqBgetPurchaseCreate> getEnqBgetPchurCreate(Integer enqid ,List<Integer> quoteids);


	/*
	* 导出询价清单
	* */
	void exportEnquiryItem(Integer enquiryId , Integer qtype , Integer companyId , HttpServletResponse response , HttpServletRequest request);
	/*
	* 导出询价清单
	* */
	void exportEnquiryItemForTest(Integer enquiryId , Integer qtype , Integer companyId , HttpServletResponse response , HttpServletRequest request);


	/**
	 * 分析报价excel
	 * @param fileName
	 * @return
	 */
	Map<String , Object> importQuoteItem(String excelPath , String fileName , Integer quoteId , Integer enquiryId);

	/**
	 * 前台报价之后直接分析
	 * @param excelPath
	 * @param fileName
	 * @param enquiryId
	 * @return
	 */
	Map<String , Object> importQuoteItem(String excelPath , String fileName , Integer enquiryId);


	//Map<String, Object> getImportQuoteItems(File file, String fileName);

	/**
	 * 项目详情,采购询价,报价详情
	 * Created by 张栋 on 2016/10/10 10:08
	 */
	List<EnqQuoteDetail> getProjPurchaseQuoteDetail(Integer enqid);

	/**
	 * 根据quoteid 查找  报价
	 * Created by 张栋 on 2016/10/10 11:15
	 */
	EnqQuote getEnqQuoteById(Integer quoteid);

	/**
	 *
	 * 询价,报价列表,报价清单
	 * Created by 张栋 on 2016/10/10 11:15
	 */
	List<EnqQuoteItemExt> getEnqQuoteItemExt(Integer quoteid);

	/**
	 * 获取推荐供应商,
	 * @param companyid 公司id
	 * Created by 张栋 on 2016/10/11 9:49
	 */
	List<EnqPurchaseRecommend> getEnqRecommend(Integer companyid);



	EnqEnquiry  getEnqEnquiryByIdWidthItem(Integer enqid);
	/**
	 * 查询价与item,多个用户条件
	 * Created by 张栋 on 2016/11/2 10:01
	 */
	EnqEnquiry getEnqEnquiryByIdWidthItem(Integer enqid, Integer userid);
	
	/** 
	 * @Title: getEnqProjectItemByCompanyId 
	 * @Description:分公司查看项目详情的页面，参数：开始时间结束时间，以及关键字查询
	 * @param companyid
	 * @param keyword
	 * @param stdate
	 * @param endate
	 * @return
	 * @return: List<EnProjectShowItem>
	 * @author: 查恒 2016年10月13日 下午2:41:01 
	 */
	Pagination getEnqProjectItemByCompanyId(int pageNo, int pageSize, Integer companyId,Map<String, String> searchMap);


    /**
     * 项目,采购询价,查看报价,列表筛选需要相关供应商报价的系统类别
     * Created by 张栋 on 2016/10/14 15:16
     */
    List<EnqCatChoose> getEnqCatChoose(Integer enqid);


    /**
     * 报价详情,根据类目筛选数据
     * Created by 张栋 on 2016/10/17 14:49
     */
    List<EnqCatChoose> getQuoteCatChoose(Integer quoteid);

    /**
     * 创建采购预算,保存到数据库
     * Created by 张栋 on 2016/10/19 10:51
     */
    EnqBudget budgetPurchaseSave(Integer enqid, List<EnqBgetPchaseSave> checked, Integer userid, Integer companyid);

	/**
	 * 获取project扩展
	 * Created by 张栋 on 2016/10/21 14:54
	 */
    EnqProjectExt getEnqProjectExtById(Integer projid);

	/**
	 * 后台询价列表数据获取方法
	 * @param qtype   设计询价1   采购询价2
	 * @param type 未审核1  已审核2 已截止3
	 * @return
	 */
	Pagination getBackEnquiryList( Map<String, String> searchMap , Integer pageNo , Integer pageSize);


	/**后台询价列表数据获取方法(仅用来获取数量)
	 * @param qtype   设计询价1   采购询价2
	 * @param type 未审核1  已审核2 已截止3
	 * @param searchMap
	 * @return
	 */
	Integer getBackEnquiryListNum(Map<String, String> searchMap);


	/**
	 * 预算转采购
	 * Created by 张栋 on 2016/10/25 14:30
	 */
    EnqEnquiry budgetTopurchase(Integer budgetid, String deadtime, Integer userId, Integer companyId) throws Exception;


	/**
	 * 保存报价明细
	 * @param items
	 * @throws Exception
	 */
	void saveQuoteItemList(List<EnqQuoteItem> items) throws Exception;

	/**
	 * 报价审核通过  并且保存报价明细
	 * @param items
	 * @param quoteId
	 * @throws Exception
	 */
	void passQuoteAndItems(List<EnqQuoteItem> items , Integer quoteId) throws Exception;

	/**
	 * 修改报价状态
	 * @param quoteId
	 * @param state
	 * @throws Exception
	 */
	void changeQuoteState(Integer quoteId , Integer state , String suggest) throws Exception;

	/**
	 * 根据报价id获取报价明细
	 * @param quoteId
	 * @return
	 */
	List<EnqQuoteItem> getItemByQuote(Integer quoteId);


	/**
	 * 关闭项目
	 * Created by 张栋 on 2016/11/14 10:21
	 */
    boolean closeProject(Integer projectId);
	public boolean needely();
	/**
	 * 获取公开发布需要通知的供应商名称
	 * Created by 张栋 on 2016/11/24 10:54
	 * ifsend 是否发送, true 发送,  false不发送
	 * 返回约发送人数
	 */
    Integer getNeedPubSMS(Integer enquiryid, String url,boolean ifsend);

	/**/
	Integer getNeedSMS(Integer enquiryid, String url,boolean ifsend);

	/**
	 * 关闭询价单
	 * Created by 张栋 on 2016/11/21 13:27
	 */
    boolean closeEnquiry(Integer enqid);

	/**
	 * 保存采购商查看报价
	 * @param quote
	 */
	void saveWatchQuote(EnqQuote quote);

	/**
	 * 定时任务需要的询价
	 * Created by 张栋 on 2016/11/23 13:20
	 */

	List<EnqEnquiry> getTaskEnqByStates();

	/**
	 * 项目汇
	 * */
    List<Map> searchXmh(Map param);

	/**
	 * 项目汇详情页关注单位
	 * @param enquiryId
	 * @param orderDown
	 * @return
	 */
	List<Map> getFocusCompanys(Integer enquiryId , Integer orderDown);


	/**
	 * 项目汇详情中的最新发布
	 * @param companyId
	 * @return
	 */
	List<PushEnquiryListDto> getNewPush( Integer companyId , Integer pageSize);

	/**
	 * 个人中心首页
	 * 设计询价收到的报价
	 * Created by 张栋 on 2016/11/30 15:48
	 */
    Integer getQuoteCountByType(Integer userid, Integer qtype);

	/**
	 * 公司是否报过价
	 * */
    boolean hasQuote(int companyId, int enquiryId);

	/**
	 * 判断某人是否能对某询价进行报价<br>
	 * 1. 该用户是供应商
	 * 2. 该用户所属公司已通过审核，该询价已经通过审核
	 * 3. 该用户未对其报过价，且不是自己的公司发的
	 * 4. 询价的系统在用户的经营系统范围内
	 * 5. 询价地区在用户的经营地区范围内
	 * 6. 若询价为不公开，则用户需在邀请的供应商之列
	 * */
	AjaxJson canQuote(User user, List<Role> roleList, Company company, Role currentRole, int enquiryId);

	/**
	 * 更新询价下载情况
	 * @param companyId
	 * @param enqId
	 */
	void updateEnqDowsCus(Integer companyId , Integer enqId);

	
	/**
	 *根据  询价id 与状态,查报价数量
	 * Created by 张栋 on 2016/12/20 14:51
	 */
	Integer getQuoteCountEnqStat(Integer enqid, int quotestat);

    List<EcharsProjectArea> projectArea();

	/**
	 * 根据项目名称获取项目
	 * Created by 张栋 on 2017/1/16 10:29
	 */
    List<EnqProject> getEnqProjectByName(String projectname, Integer userid);

	/**
	 * 获取询价 id 与 更新时间
     */
	List<EnqEnquiry> listEnquiryBySize(int size);
}

